home *** CD-ROM | disk | FTP | other *** search
/ Nejlepší hry / Nejlepsi hry.iso / hry / plane arcade / planearcade.exe / tank3.bmp / model.cpp < prev    next >
C/C++ Source or Header  |  2004-09-27  |  49KB  |  1,793 lines

  1.  
  2. #include "main.h"
  3.  
  4. //------------------------------------------------------------------
  5. // Name: MODEL()
  6. // Desc: konstruktor
  7. //------------------------------------------------------------------
  8. MODEL::MODEL()
  9. {
  10.  
  11.     g_pVB      = NULL; 
  12.     g_pTexture = NULL;  
  13.     g_pEnviroMap = NULL; 
  14.  
  15.     ModelFrame;
  16.  
  17.     Color = GetColor(1.0f,1.0f,1.0f,1.0f);
  18.     Lighting = true ;
  19.     Specular = false ;
  20.     BumpMap = false;
  21.     EnviromentMapping = false;
  22.     MultiTexture = false; 
  23.     OnlyShadow = false;
  24.     Textured = true;
  25.     FrustrumTest = true;
  26.     SmoothShading = true;
  27.     Normals = true;
  28.     Frame = 0.0f;
  29.  
  30.     NumFrames = 0;
  31.     NumFaces = 0;
  32.  
  33.     Pos = Get3D(0.0f,0.0f,0.0f);
  34.     Rot = Get3D(0.0f,0.0f,0.0f);
  35.     Sca = Get3D(1.0f,1.0f,1.0f);
  36. }
  37.  
  38.  
  39. //------------------------------------------------------------------
  40. // Name: ~MODEL()
  41. // Desc: destruktor
  42. //------------------------------------------------------------------
  43. MODEL::~MODEL()
  44. {
  45.  
  46.     if (g_pTexture != NULL)
  47.         g_pTexture->Release();
  48.     g_pTexture = NULL;
  49.  
  50.     if (g_pEnviroMap != NULL)
  51.         g_pEnviroMap->Release();
  52.     g_pEnviroMap = NULL;
  53.  
  54.     if (g_pVB != NULL)
  55.         g_pVB->Release();
  56.     g_pVB = NULL;
  57.  
  58.     //znicmodel
  59.     DestroyModel(&ModelFrame);
  60.  
  61.  
  62. }
  63.  
  64. //------------------------------------------------------------------
  65. // Name: DestroyModel()
  66. // Desc: Znic model
  67. //------------------------------------------------------------------
  68. void MODEL::DestroyModel(MODELFRAME *Mod)
  69. {
  70.  
  71.     if (Mod->FaceList != NULL)
  72.         delete [] Mod->FaceList;
  73.     Mod->FaceList = NULL;
  74.     
  75. }
  76.  
  77. //------------------------------------------------------------------
  78. // Name: InitializeModel()
  79. // Desc: inicializuj model podla poctu trojholnikov
  80. //------------------------------------------------------------------
  81. void MODEL::InitializeModel(MODELFRAME *Mod,int NFaces)
  82. {
  83.     Mod->FaceList = new MODELFACE[NFaces];
  84.     Mod->NumFaces = NFaces;
  85.     Mod->ActFace = 0;
  86.  
  87.     Mod->Centre = Get3D(0.0f,0.0f,0.0f);
  88. }
  89.  
  90. //------------------------------------------------------------------
  91. // Name: GetNumFace()
  92. // Desc: Zisti pocet Face z Ase suboru
  93. //------------------------------------------------------------------
  94. int MODEL::GetNumFace(char *FileName)
  95. {
  96.     FILE *fp;
  97.     char cBuf[80]; 
  98.     int Vys = 0;
  99.     int Pom = 0;
  100.  
  101.     fp = fopen(FileName,"r");
  102.  
  103.     if (fp == NULL)
  104.     {
  105.         sprintf(cBuf,"  Nenasiel som subor %s",FileName);
  106.         LogPrint(cBuf);
  107.     }
  108.  
  109.     while(!feof(fp))
  110.     {
  111.         fscanf(fp,"%s",cBuf);
  112.  
  113.         if (strcmp("*MESH_NUMFACES",cBuf) == 0)
  114.         {
  115.             fscanf(fp,"%d",&Pom);
  116.             Vys = Vys + Pom;
  117.         }
  118.         
  119.     }
  120.  
  121.     fclose(fp);
  122.  
  123.     return Vys;
  124. }
  125.  
  126.  
  127. //------------------------------------------------------------------
  128. // Name: InitializeAse()
  129. // Desc: zinicializuje polia podla Ase modelu
  130. //------------------------------------------------------------------
  131. void MODEL::InitializeAse(int NFrames,char *FileName)
  132. {
  133.  
  134.     char cBuf[80];
  135.     LogPrint("Inicializujem ASE model");
  136.  
  137.     //nacita pocet trojholnikov z Ase suboru
  138.     NumFrames = NFrames;
  139.     NumFaces = GetNumFace(FileName);
  140.     
  141.     sprintf(cBuf,"  NumFrames: %d",NumFrames);
  142.     LogPrint(cBuf);
  143.     sprintf(cBuf,"  NumFaces: %d",NumFaces);
  144.     LogPrint(cBuf);
  145.  
  146.     //inicializuje model
  147.     InitializeModel(&ModelFrame,NumFaces);
  148.  
  149.     //vytvaranie vertex buffera
  150.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  151.                                    D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEXMODEL,
  152.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  153.       {
  154.         LogPrint("  Chyba pri vytvarani VB");
  155.     }
  156.     else
  157.     {
  158.         LogPrint("  Vertex Buffer vytvoreny");
  159.     }
  160.  
  161.     
  162. }
  163.  
  164.  
  165. //------------------------------------------------------------------
  166. // Name: LoadAse()
  167. // Desc: loadne ase model
  168. //------------------------------------------------------------------
  169. void MODEL::LoadAse(int IntoFrame,char *FileName)
  170. {
  171.  
  172.  
  173.     FILE *fp;     //subor
  174.     char cBuf[80]; //nacitavanie
  175.  
  176.     fp = fopen(FileName,"r");
  177.  
  178.     if (fp == NULL)
  179.     {
  180.         sprintf(cBuf,"  Nenasiel som subor %s",FileName);
  181.         LogPrint(cBuf);
  182.     }
  183.  
  184.     //ak narazis na GEOMOBJECT nacitaj node
  185.     while(!feof(fp))
  186.     {
  187.         fscanf(fp,"%s",cBuf);
  188.         
  189.         //----------------*GEOMOBJECT----------------
  190.         if (strcmp(cBuf,"*GEOMOBJECT") == 0)
  191.         {
  192.             AddNode(&ModelFrame,fp);
  193.         }
  194.  
  195.         strcpy(cBuf,"");
  196.  
  197.     }
  198.  
  199.     fclose(fp);
  200.  
  201.     //vypocitajminmax
  202.     CalcBoxPoints(&ModelFrame);
  203.  
  204.     //vypocitaj normaly
  205.     if (Normals == true)
  206.         CalcFaceNormals(&ModelFrame);
  207.  
  208.     //vypocitaj smooth shading
  209.     if (SmoothShading == true)
  210.         CalcSmoothShading(&ModelFrame);
  211.  
  212.     //------------------
  213.     // Naplni VB
  214.     //------------------
  215.     int ActVertex = 0;
  216.  
  217.     //pomocne
  218.     int u,i;
  219.     
  220.     //Vertex do ktoreho sa uklada
  221.     CUSTOMVERTEXMODEL *Vertex;
  222.  
  223.     //Otvor VB
  224.     g_pVB->Lock(0, 0, (void**)&Vertex,D3DLOCK_DISCARD ) ;
  225.  
  226.     //zobrazi model do pola vertexov
  227.     for (i = 0;i<NumFaces;i++)
  228.     {
  229.         for (u=0;u<3;u++)
  230.         {
  231.  
  232.             Vertex[ActVertex].pos.x = ModelFrame.FaceList[i].P[u].X;
  233.             Vertex[ActVertex].pos.y = ModelFrame.FaceList[i].P[u].Y;
  234.             Vertex[ActVertex].pos.z = ModelFrame.FaceList[i].P[u].Z;
  235.  
  236.             Vertex[ActVertex].normal.x = ModelFrame.FaceList[i].N[u].X;
  237.             Vertex[ActVertex].normal.y = ModelFrame.FaceList[i].N[u].Y;
  238.             Vertex[ActVertex].normal.z = ModelFrame.FaceList[i].N[u].Z;
  239.         
  240.             Vertex[ActVertex].tu = ModelFrame.FaceList[i].T[u].X;
  241.             Vertex[ActVertex].tv = ModelFrame.FaceList[i].T[u].Y;
  242.         
  243.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  244.                                                 Color.G,
  245.                                                 Color.B,
  246.                                                 Color.A);
  247.  
  248.     
  249.             ActVertex = ActVertex + 1;                
  250.         }    
  251.  
  252.     }
  253.  
  254.  
  255.     //uzavri VB
  256.     g_pVB->Unlock() ;
  257.  
  258. }
  259.  
  260.  
  261. //------------------------------------------------------------------
  262. // Name: AddNode()
  263. // Desc: prida do modelu geom objekt
  264. //------------------------------------------------------------------
  265. void MODEL::AddNode(MODELFRAME *Mod,FILE *fp)
  266. {
  267.  
  268.     //zasobniky vertexov
  269.     VECTOR3D *V = NULL;
  270.     VECTOR3D *T = NULL;
  271.  
  272.     char cBuf[80]; //nacitavanie
  273.  
  274.     int NumV;  //pocet vertexov
  275.     int NumT;  //pocet texture vertexov   
  276.     int NumF;  //pocet facov
  277.  
  278.     D3DXMATRIX RotationMatrix;
  279.     D3DXVECTOR3 RotVector;
  280.     float RotAngle;
  281.  
  282.     while(1==1)
  283.     {
  284.         //nacitaj retazec
  285.         fscanf(fp,"%s",cBuf);
  286.  
  287.         //-----------*TM_ROTAXIS---------------- 
  288.         if (strcmp(cBuf,"*TM_ROTAXIS") == 0)
  289.         {
  290.             fscanf(fp,"%f %f %f",&RotVector.x,&RotVector.z,&RotVector.y);    
  291.         }
  292.  
  293.         //-----------*TM_ROTANGLE---------------
  294.         if (strcmp(cBuf,"*TM_ROTANGLE") == 0)
  295.         {
  296.             fscanf(fp,"%f",&RotAngle);    
  297.  
  298.             //vypocita maticu rotacie
  299.             D3DXMatrixIdentity(&RotationMatrix);     
  300.             D3DXMatrixRotationAxis(&RotationMatrix,&RotVector,RotAngle);
  301.         }
  302.  
  303.         //-----------*MESH_NUMVERTEX------------
  304.         if (strcmp(cBuf,"*MESH_NUMVERTEX") == 0)
  305.         {
  306.             fscanf(fp,"%d",&NumV);    
  307.             V = new VECTOR3D[NumV];
  308.         }
  309.  
  310.         //-----------*MESH_NUMTVERTEX------------
  311.         if (strcmp(cBuf,"*MESH_NUMTVERTEX") == 0)
  312.         {
  313.             fscanf(fp,"%d",&NumT);    
  314.             T = new VECTOR3D[NumT];
  315.         }
  316.         //-----------*MESH_NUMFACES-------------
  317.         if (strcmp(cBuf,"*MESH_NUMFACES") == 0)
  318.         {
  319.             fscanf(fp,"%d",&NumF);    
  320.         }
  321.  
  322.         //-----------*MESH_VERTEX---------------
  323.         if (strcmp(cBuf,"*MESH_VERTEX") == 0)
  324.         {
  325.             int Id;
  326.             float Xs, Ys, Zs;
  327.  
  328.             fscanf(fp,"%d %f %f %f",&Id,&Xs,&Zs,&Ys);
  329.             
  330.             V[Id] = Get3D(Xs,Ys,Zs);
  331.  
  332.         }
  333.  
  334.         //-----------*MESH_FACE-----------------
  335.         if (strcmp(cBuf,"*MESH_FACE") == 0)
  336.         {
  337.             int Id = Mod->ActFace;
  338.  
  339.             int V1,V2,V3;
  340.  
  341.             fscanf(fp,"%s %s %d %s %d %s %d",cBuf,cBuf,&V1,cBuf,&V2,cBuf,&V3);
  342.         
  343.             Mod->FaceList[Id].P[0] = V[V3];
  344.             Mod->FaceList[Id].P[1] = V[V2];
  345.             Mod->FaceList[Id].P[2] = V[V1];
  346.  
  347.             Mod->ActFace = Mod->ActFace + 1;
  348.     
  349.         }
  350.         //-----------*MESH_TVERT----------------
  351.         if (strcmp(cBuf,"*MESH_TVERT") == 0)
  352.         {
  353.             int Idf;
  354.             float Xs, Ys, Zs;
  355.  
  356.             fscanf(fp,"%d %f %f %f",&Idf,&Xs,&Ys,&Zs);
  357.  
  358.             T[Idf] = Get3D(Xs,-Ys,Zs);
  359.                     
  360.         }
  361.         //-----------*MESH_TFACE----------------
  362.         if (strcmp(cBuf,"*MESH_TFACE") == 0)
  363.         {
  364.             int Id = Mod->ActFace;
  365.         
  366.             int Idf; 
  367.             int V1,V2,V3;
  368.  
  369.             fscanf(fp,"%d %d %d %d",&Idf,&V1,&V2,&V3);
  370.     
  371.             Mod->FaceList[Id - NumF + Idf].T[0].X = T[V3].X;
  372.             Mod->FaceList[Id - NumF + Idf].T[0].Y = T[V3].Y;
  373.         
  374.             Mod->FaceList[Id - NumF + Idf].T[1].X = T[V2].X;
  375.             Mod->FaceList[Id - NumF + Idf].T[1].Y = T[V2].Y;
  376.             
  377.             Mod->FaceList[Id - NumF + Idf].T[2].X = T[V1].X;
  378.             Mod->FaceList[Id - NumF + Idf].T[2].Y = T[V1].Y;
  379.  
  380.         }
  381.  
  382.         //---------*MESH_FACENORMAL----------------
  383.         if (strcmp(cBuf,"*MESH_FACENORMAL") == 0)
  384.         {
  385.             
  386.             float X,Y,Z;
  387.             int Id ;
  388.             int VId;
  389.  
  390.             fscanf(fp,"%d",&Id);
  391.             Id = Mod->ActFace-NumF+Id;
  392.  
  393.             fscanf(fp,"%d %f %f %f",&VId,&X,&Z,&Y);
  394.             
  395.             //v0
  396.             fscanf(fp,"%s %d %f %f %f %f",cBuf,&VId,&X,&Z,&Y);
  397.             Mod->FaceList[Id].N[2] = Get3D(X,Y,Z);
  398.             Mod->FaceList[Id].N[2] = TransformNormal(Mod->FaceList[Id].N[2], RotationMatrix);
  399.  
  400.             //v1
  401.             fscanf(fp,"%s %d %f %f %f %f",cBuf,&VId,&X,&Z,&Y);
  402.             Mod->FaceList[Id].N[1] = Get3D(X,Y,Z);
  403.             Mod->FaceList[Id].N[1] = TransformNormal(Mod->FaceList[Id].N[1], RotationMatrix);
  404.  
  405.             //v2
  406.             fscanf(fp,"%s %d %f %f %f %f",cBuf,&VId,&X,&Z,&Y);
  407.             Mod->FaceList[Id].N[0] = Get3D(X,Y,Z);
  408.             Mod->FaceList[Id].N[0] = TransformNormal(Mod->FaceList[Id].N[0], RotationMatrix);
  409.  
  410.             //plane
  411.             VECTOR3D N,V1,V2;
  412.             Sub(&V1,Mod->FaceList[Id].P[0],Mod->FaceList[Id].P[1]);
  413.             Sub(&V2,Mod->FaceList[Id].P[2],Mod->FaceList[Id].P[1]);
  414.             Cross(&N,V1,V2);
  415.             Normalize(&N);
  416.  
  417.             Mod->FaceList[Id].Plane.Normal = N;
  418.             Mod->FaceList[Id].Plane.D = -(N.X * Mod->FaceList[Id].P[1].X) 
  419.                                         -(N.Y * Mod->FaceList[Id].P[1].Y)
  420.                                         -(N.Z * Mod->FaceList[Id].P[1].Z);
  421.  
  422.     
  423.         }
  424.  
  425.         //-----------END GEOM OBJ--------------
  426.         if (strcmp(cBuf,"*PROP_MOTIONBLUR") == 0)
  427.         {
  428.             break;
  429.         }
  430.  
  431.         
  432.  
  433.  
  434.     }
  435.  
  436.     if (V != NULL)
  437.         delete [] V;
  438.  
  439.     if (T != NULL)
  440.         delete [] T;
  441.  
  442. }
  443.  
  444.  
  445. //------------------------------------------------------------------
  446. // Name: LoadTexture()
  447. // Desc: Loadne texturu
  448. //------------------------------------------------------------------
  449. void MODEL::LoadTexture(char *FileName,COLOR ColorKey)
  450. {
  451.  
  452.     char cBuf[80];
  453.  
  454.     sprintf(cBuf,"  Textura: %s",FileName);
  455.     LogPrint(cBuf);
  456.     
  457.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  458.                                   FileName,    
  459.                                   D3DX_DEFAULT, 
  460.                                   D3DX_DEFAULT, 
  461.                                   Engine.MipMapLevels,   //MipLevels
  462.                                   0,            
  463.                                   Engine.TextureFormat, 
  464.                                   D3DPOOL_DEFAULT,
  465.                                   D3DX_DEFAULT, //Filter
  466.                                   D3DX_DEFAULT, //MipFilter
  467.                                   D3DXCOLOR    (ColorKey.R,
  468.                                                 ColorKey.G,
  469.                                                 ColorKey.B,
  470.                                                 ColorKey.A),   //ColourKey
  471.                                   NULL,         
  472.                                   NULL,         
  473.                                   &g_pTexture)))  
  474.     {
  475.         sprintf(cBuf,"  chyba pri vytvarani textury: %s",FileName);
  476.         LogPrint(cBuf);
  477.     }
  478.     else
  479.     {
  480.         LogPrint("  Textura modelu vytvorena");
  481.     }    
  482.  
  483. }
  484.  
  485. //------------------------------------------------------------------
  486. // Name: LoadTexture()
  487. // Desc: Loadne texturu
  488. //------------------------------------------------------------------
  489. void MODEL::LoadEnviroMap(char *FileName)
  490. {
  491.  
  492.     char cBuf[80];
  493.  
  494.     sprintf(cBuf,"  Enviroment Textura: %s",FileName);
  495.     LogPrint(cBuf);
  496.     
  497.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, 
  498.                                   FileName,    
  499.                                   D3DX_DEFAULT, 
  500.                                   D3DX_DEFAULT, 
  501.                                   Engine.MipMapLevels,   //MipLevels
  502.                                   0,            
  503.                                   Engine.TextureFormat, 
  504.                                   D3DPOOL_DEFAULT,
  505.                                   D3DX_DEFAULT, //Filter
  506.                                   D3DX_DEFAULT, //MipFilter
  507.                                   0,   //ColourKey
  508.                                   NULL,         
  509.                                   NULL,         
  510.                                   &g_pEnviroMap)))  
  511.     {
  512.         sprintf(cBuf,"  chyba pri vytvarani Enviroment Textury: %s",FileName);
  513.         LogPrint(cBuf);
  514.     }
  515.     else
  516.     {
  517.         LogPrint("  Enviroment Textura modelu vytvorena");
  518.     }    
  519.  
  520. }
  521.  
  522.  
  523. //------------------------------------------------------------------
  524. // Name: RenderModelNormal()
  525. // Desc: Ulozi model do Vertex pola + vyrenderuje normalne
  526. //------------------------------------------------------------------
  527. void MODEL::RenderModelNormal(MODELFRAME Mod)
  528. {
  529.     
  530.     //
  531.     //TEXTURED
  532.     //
  533.     if (Textured == true)
  534.     {
  535.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  536.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  537.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  538.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  539.     }
  540.     else
  541.     {
  542.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  543.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
  544.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  545.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  546.     }
  547.  
  548.     //nastav material
  549.     g_pd3dDevice->SetMaterial(&Material);
  550.  
  551.     //zapni vypni svetla
  552.     Engine.SetLighting(Lighting);
  553.  
  554.     //zapni specular ak je zapnuty
  555.     Engine.SetSpecular(Specular);
  556.  
  557.     //zapni dx back face culling
  558.     Engine.SetCullMode(D3DCULL_CCW);
  559.  
  560.     //renderuje z VB
  561.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  562.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  563.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  564.             
  565.     //reset to default
  566.     Engine.ResetToDefault();
  567.  
  568.     
  569. }
  570.  
  571. //------------------------------------------------------------------
  572. // Name: RenderModelOnlyShadow()
  573. // Desc: Ulozi model do Vertex pola + iba pre tien
  574. //------------------------------------------------------------------
  575. void MODEL::RenderModelOnlyShadow(MODELFRAME Mod)
  576. {
  577.     
  578.     int ActVertex = 0;
  579.  
  580.     //
  581.     //TEXTURED
  582.     //
  583.     if (Textured == true)
  584.     {
  585.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  586.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  587.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  588.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  589.     }
  590.     else
  591.     {
  592.         g_pd3dDevice->SetTexture( 0, g_pTexture );
  593.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
  594.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  595.         g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  596.     }
  597.  
  598.     //reset to default
  599.     Engine.ResetToDefault();
  600.  
  601.     
  602. }
  603.  
  604. //------------------------------------------------------------------
  605. // Name: RenderModelEnvironment()
  606. // Desc: Ulozi model do Vertex pola + vyrenderuje cez enviro mapping
  607. //------------------------------------------------------------------
  608. void MODEL::RenderModelEnvironment(MODELFRAME Mod)
  609. {
  610.     
  611.     int ActVertex = 0;
  612.  
  613.     //pomocne
  614.     VECTOR3D P,N;
  615.     int u,i;
  616.     
  617.     //Vertex do ktoreho sa uklada
  618.     CUSTOMVERTEXMODEL *Vertex;
  619.  
  620.     //Otvor VB
  621.     g_pVB->Lock(0, 0, (void**)&Vertex, D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE ) ;
  622.  
  623.     //zobrazi model do pola vertexov
  624.     for (i = 0;i<NumFaces;i++)
  625.     {
  626.         for (u=0;u<3;u++)
  627.         {
  628.  
  629.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  630.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  631.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  632.  
  633.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  634.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  635.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  636.         
  637.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  638.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  639.         
  640.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  641.                                                 Color.G,
  642.                                                 Color.B,
  643.                                                 Color.A);
  644.  
  645.             //////////////////////
  646.             //ENVIROMENT MAPPING//
  647.             //////////////////////
  648.             P = TransformPoint(Mod.FaceList[i].P[u],Matica);
  649.             N = TransformNormal(Mod.FaceList[i].N[u],Matica);
  650.  
  651.             Mod.FaceList[i].T[u] = EnvironmentMapping(P,N,400.0f,matView);
  652.         
  653.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  654.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  655.  
  656.         
  657.     
  658.             ActVertex = ActVertex + 1;                
  659.         }    
  660.  
  661.     }
  662.  
  663.  
  664.     //uzavri VB
  665.     g_pVB->Unlock() ;
  666.  
  667.     g_pd3dDevice->SetTexture( 0, g_pTexture );
  668.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
  669.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  670.     g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  671.  
  672.     //nastav material
  673.     g_pd3dDevice->SetMaterial(&Material);
  674.  
  675.     //zapni vypni svetla
  676.     Engine.SetLighting(Lighting);
  677.  
  678.     //zapni specular ak je zapnuty
  679.     Engine.SetSpecular(Specular);
  680.  
  681.     //renderuje z VB
  682.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  683.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  684.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  685.             
  686.     //reset to default
  687.     Engine.ResetToDefault();
  688.  
  689.  
  690. }
  691.  
  692. //------------------------------------------------------------------
  693. // Name: RenderModelMultiTexture()
  694. // Desc: Ulozi model do Vertex pola + vyrenderuje cez enviro mapping
  695. //------------------------------------------------------------------
  696. void MODEL::RenderModelMultiTexture(MODELFRAME Mod)
  697. {
  698.     
  699.     int ActVertex = 0;
  700.  
  701.  
  702.     g_pd3dDevice->SetTexture( 0,  g_pTexture );
  703.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
  704.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  705.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  706.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  707.  
  708.     g_pd3dDevice->SetTexture( 1,  g_pEnviroMap );
  709.     D3DXMATRIX mat;
  710.     mat._11 = 0.65f; mat._12 = 0.00f; mat._13 = 0.00f; mat._14 = 0.00f;
  711.     mat._21 = 0.00f; mat._22 = 0.65f; mat._23 = 0.00f; mat._24 = 0.00f;
  712.     mat._31 = 0.00f; mat._32 = 0.00f; mat._33 = 1.00f; mat._34 = 0.00f;
  713.     mat._41 = 0.00f; mat._42 = 0.00f; mat._43 = 0.00f; mat._44 = 1.00f;
  714.     g_pd3dDevice->SetTransform( D3DTS_TEXTURE1, &mat );
  715.     g_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
  716.     g_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS,  D3DTTFF_COUNT3);
  717.  
  718.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
  719.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  720.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
  721.  
  722.     //nastav material
  723.     g_pd3dDevice->SetMaterial(&Material);
  724.  
  725.     //zapni vypni svetla
  726.     Engine.SetLighting(Lighting);
  727.  
  728.     //zapni specular ak je zapnuty
  729.     Engine.SetSpecular(Specular);
  730.  
  731.     //renderuje z VB
  732.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  733.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  734.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  735.             
  736.     //reset to default
  737.     Engine.ResetToDefault();
  738.     D3DXMatrixIdentity(&mat);
  739.     g_pd3dDevice->SetTransform( D3DTS_TEXTURE1,&mat );
  740.  
  741.  
  742. }
  743.  
  744. //------------------------------------------------------------------
  745. // Name: RenderModelBumpMap()
  746. // Desc: Ulozi model do Vertex pola + vyrenderuje cez bump mapping
  747. //------------------------------------------------------------------
  748. void MODEL::RenderModelBumpMap(MODELFRAME Mod)
  749. {
  750.     
  751.     int ActVertex = 0;
  752.  
  753.     //pomocne
  754. //    VECTOR3D N;
  755. //    VECTOR2D T;
  756.     int u,i;
  757.     
  758.     //Vertex do ktoreho sa uklada
  759.     CUSTOMVERTEXMODEL *Vertex;
  760.  
  761.     //Otvor VB
  762.     g_pVB->Lock(0, 0, (void**)&Vertex,D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE) ;
  763.  
  764.     //zobrazi model do pola vertexov
  765.     for (i = 0;i<NumFaces;i++)
  766.     {
  767.         for (u=0;u<3;u++)
  768.         {
  769.  
  770.             Vertex[ActVertex].pos.x = Mod.FaceList[i].P[u].X;
  771.             Vertex[ActVertex].pos.y = Mod.FaceList[i].P[u].Y;
  772.             Vertex[ActVertex].pos.z = Mod.FaceList[i].P[u].Z;
  773.  
  774.             Vertex[ActVertex].normal.x = Mod.FaceList[i].N[u].X;
  775.             Vertex[ActVertex].normal.y = Mod.FaceList[i].N[u].Y;
  776.             Vertex[ActVertex].normal.z = Mod.FaceList[i].N[u].Z;
  777.         
  778.             Vertex[ActVertex].tu = Mod.FaceList[i].T[u].X;
  779.             Vertex[ActVertex].tv = Mod.FaceList[i].T[u].Y;
  780.         
  781.             Vertex[ActVertex].color = D3DXCOLOR(Color.R,
  782.                                                 Color.G,
  783.                                                 Color.B,
  784.                                                 Color.A);
  785.  
  786.             /*
  787.             ////////////////
  788.             //BUMP MAPPING//
  789.             ////////////////
  790.             N = TransformNormal(Mod.FaceList[i].N[u],Matica);
  791.  
  792.             T = BumpMapping(N,Mod.FaceList[i].T[u],0.05f,matView);
  793.     
  794.             //suradnice pre bump map
  795.             Vertex[ActVertex].tu2 = T.X;
  796.             Vertex[ActVertex].tv2 = T.Y;
  797.             */
  798.  
  799.             
  800.             
  801.             ActVertex = ActVertex + 1;                
  802.         }    
  803.  
  804.     }
  805.  
  806.  
  807.     //uzavri VB
  808.     g_pVB->Unlock() ;
  809.  
  810.     ////////////////
  811.     //BUMP MAPPING//
  812.     ////////////////
  813.     g_pd3dDevice->SetTexture( 0,  g_pTexture );
  814.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
  815.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
  816.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  817.     g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  818.  
  819.     g_pd3dDevice->SetTexture( 1,  g_pTexture );
  820.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
  821.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
  822.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  823.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
  824.  
  825.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_ADDSIGNED );
  826.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT );
  827.     g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
  828.     
  829.     Engine.SetBlendCustom(D3DBLEND_SRCALPHA,D3DBLEND_ZERO);
  830.  
  831.  
  832.  
  833.     //nastav material
  834.     g_pd3dDevice->SetMaterial(&Material);
  835.  
  836.     //zapni vypni svetla
  837.     Engine.SetLighting(Lighting);
  838.  
  839.     //zapni specular ak je zapnuty
  840.     Engine.SetSpecular(Specular);
  841.  
  842.     //renderuje z VB
  843.     g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEXMODEL));
  844.     g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEXMODEL);
  845.     g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumFaces);
  846.             
  847.     //reset to default
  848.     Engine.ResetToDefault();
  849.  
  850.     //zresetuj blending
  851.     Engine.SetBlendNone();
  852.  
  853.  
  854. }
  855.  
  856.  
  857. //------------------------------------------------------------------
  858. // Name: Render()
  859. // Desc: Vyrenderuje 
  860. //------------------------------------------------------------------
  861. void MODEL::Render()
  862. {
  863.  
  864.     if (Frame >= NumFrames)
  865.             Frame = 0.0f;
  866.  
  867.     //vypocita maticu
  868.     Matica = GetMatrix(Pos,Rot,Sca);
  869.  
  870.     //ziska polomer a minmax
  871.     CalcMinMax(&ModelFrame,Matica);    
  872.     
  873.     //ak model vidno renderuj ho
  874.     if ((Camera.FrustrumSphere(ModelFrame.Centre,ModelFrame.Polomer) == true) ||
  875.         (FrustrumTest == false))
  876.     {
  877.         //nastavi maticu
  878.         g_pd3dDevice->SetTransform(D3DTS_WORLD, &Matica);
  879.  
  880.         //renderuj model
  881.         if (EnviromentMapping == true)
  882.             RenderModelEnvironment(ModelFrame);
  883.         if (MultiTexture == true && SpecularEffects == 1)
  884.             RenderModelMultiTexture(ModelFrame);
  885.         else if (BumpMap == true)
  886.             RenderModelBumpMap(ModelFrame);
  887.         else if (OnlyShadow == true)
  888.             RenderModelOnlyShadow(ModelFrame);
  889.         else
  890.             RenderModelNormal(ModelFrame);
  891.     }
  892. }
  893.  
  894. //------------------------------------------------------------------
  895. // Name: RenderFast()
  896. // Desc: Rychle vykreslenie
  897. //------------------------------------------------------------------
  898. void MODEL::RenderFast()
  899. {
  900. /*
  901.     if (Frame >= NumFrames)
  902.             Frame = 0.0f;
  903.  
  904.     //vypocita maticu
  905.     Matica = GetMatrix(Pos,Rot,Sca);
  906.  
  907.     //ziska polomer a minmax
  908.     CalcMinMax(&ModelFrame[(int)Frame],Matica);
  909.  
  910.     //ulozi min max do transformacneho modelu
  911.     ModelT.Min = ModelFrame[(int)Frame].Min;
  912.     ModelT.Max = ModelFrame[(int)Frame].Max;
  913.     ModelT.Centre = ModelFrame[(int)Frame].Centre;
  914.     ModelT.Polomer = ModelFrame[(int)Frame].Polomer;
  915.  
  916.     //ak model vidno renderuj ho
  917.     if ((Camera.FrustrumSphere(ModelT.Centre,ModelT.Polomer) == true) ||
  918.         (FrustrumTest == false))
  919.     {
  920.         //interpoluje model podla animacie
  921.         InterpolateModel(&ModelT);
  922.         
  923.         //nastavi maticu
  924.         g_pd3dDevice->SetTransform( D3DTS_WORLD, &Matica);
  925.  
  926.         //renderuj model
  927.         if (EnviromentMapping == true)
  928.             RenderModelEnvironment(ModelT);
  929.         else if (BumpMap == true)
  930.             RenderModelBumpMap(ModelT);
  931.         else
  932.             RenderModelNormal(ModelT);
  933.     }*/
  934. }
  935.  
  936. //------------------------------------------------------------------
  937. // Name: CalcFaceNormals()
  938. // Desc: Vypocita normaly
  939. //------------------------------------------------------------------
  940. void MODEL::CalcFaceNormals(MODELFRAME *Mod)
  941. {
  942.  
  943.     VECTOR3D V1;
  944.     VECTOR3D V2;
  945.     VECTOR3D N;
  946.     
  947.     for (int i=0;i<NumFaces;i++)
  948.     {
  949.         //normalovy vektor
  950.         Sub(&V1,Mod->FaceList[i].P[0],Mod->FaceList[i].P[1]);
  951.         Sub(&V2,Mod->FaceList[i].P[2],Mod->FaceList[i].P[1]);
  952.         Cross(&N,V1,V2);
  953.         Normalize(&N);
  954.  
  955.         //kazdy vertex
  956.         Mod->FaceList[i].N[0] = N;
  957.         Mod->FaceList[i].N[1] = N;
  958.         Mod->FaceList[i].N[2] = N;
  959.  
  960.         //vypocet plane trojholnika
  961.         Mod->FaceList[i].Plane.Normal = N;
  962.         Mod->FaceList[i].Plane.D = -(N.X * Mod->FaceList[i].P[1].X) 
  963.                                    -(N.Y * Mod->FaceList[i].P[1].Y)
  964.                                    -(N.Z * Mod->FaceList[i].P[1].Z);
  965.  
  966.     }
  967.     
  968. }
  969. //------------------------------------------------------------------
  970. // Name: CalcBoxPoints()
  971. // Desc: Vypocita body krabice
  972. //------------------------------------------------------------------
  973. void MODEL::CalcBoxPoints(MODELFRAME *Mod)
  974. {
  975.     VECTOR3D Min = {10000.0f,10000.0f,10000.0f};
  976.     VECTOR3D Max = {-10000.0f,-10000.0f,-10000.0f};
  977.  
  978.     for (int i=0;i<NumFaces;i++)
  979.     {
  980.     
  981.         //
  982.         //min max
  983.         //
  984.         for (int u=0;u<3;u++)
  985.         {
  986.             if (Mod->FaceList[i].P[u].X < Min.X)
  987.                 Min.X = Mod->FaceList[i].P[u].X;
  988.             if (Mod->FaceList[i].P[u].Y < Min.Y)
  989.                 Min.Y = Mod->FaceList[i].P[u].Y;
  990.             if (Mod->FaceList[i].P[u].Z < Min.Z)
  991.                 Min.Z = Mod->FaceList[i].P[u].Z;
  992.     
  993.             if (Mod->FaceList[i].P[u].X > Max.X)
  994.                 Max.X = Mod->FaceList[i].P[u].X;
  995.             if (Mod->FaceList[i].P[u].Y > Max.Y)
  996.                 Max.Y = Mod->FaceList[i].P[u].Y;
  997.             if (Mod->FaceList[i].P[u].Z > Max.Z)
  998.                 Max.Z = Mod->FaceList[i].P[u].Z;
  999.         }
  1000.             
  1001.     }
  1002.  
  1003.     //
  1004.     //body
  1005.     //
  1006.  
  1007.     //spodna plocha
  1008.     Mod->P[0].X = Min.X;
  1009.     Mod->P[0].Y = Min.Y;
  1010.     Mod->P[0].Z = Min.Z;
  1011.  
  1012.     Mod->P[1].X = Max.X;
  1013.     Mod->P[1].Y = Min.Y;
  1014.     Mod->P[1].Z = Min.Z;
  1015.  
  1016.     Mod->P[2].X = Max.X;
  1017.     Mod->P[2].Y = Min.Y;
  1018.     Mod->P[2].Z = Max.Z;
  1019.  
  1020.     Mod->P[3].X = Min.X;
  1021.     Mod->P[3].Y = Min.Y;
  1022.     Mod->P[3].Z = Max.Z;
  1023.  
  1024.     //vrchna plocha
  1025.     Mod->P[4].X = Min.X;
  1026.     Mod->P[4].Y = Max.Y;
  1027.     Mod->P[4].Z = Min.Z;
  1028.  
  1029.     Mod->P[5].X = Max.X;
  1030.     Mod->P[5].Y = Max.Y;
  1031.     Mod->P[5].Z = Min.Z;
  1032.  
  1033.     Mod->P[6].X = Max.X;
  1034.     Mod->P[6].Y = Max.Y;
  1035.     Mod->P[6].Z = Max.Z;
  1036.  
  1037.     Mod->P[7].X = Min.X;
  1038.     Mod->P[7].Y = Max.Y;
  1039.     Mod->P[7].Z = Max.Z;
  1040. }
  1041.  
  1042.  
  1043. //------------------------------------------------------------------
  1044. // Name: CalcBoxPoints()
  1045. // Desc: Vypocita body krabice
  1046. //------------------------------------------------------------------
  1047. void MODEL::CalcMinMax(MODELFRAME *Mod,D3DXMATRIXA16 Matica)
  1048. {
  1049.     VECTOR3D Min = {10000.0f,10000.0f,10000.0f};
  1050.     VECTOR3D Max = {-10000.0f,-10000.0f,-10000.0f};
  1051.  
  1052.     VECTOR3D P[8];
  1053.  
  1054.     P[0] = TransformPoint(Mod->P[0],Matica);
  1055.     P[1] = TransformPoint(Mod->P[1],Matica);
  1056.     P[2] = TransformPoint(Mod->P[2],Matica);
  1057.     P[3] = TransformPoint(Mod->P[3],Matica);
  1058.     P[4] = TransformPoint(Mod->P[4],Matica);
  1059.     P[5] = TransformPoint(Mod->P[5],Matica);
  1060.     P[6] = TransformPoint(Mod->P[6],Matica);
  1061.     P[7] = TransformPoint(Mod->P[7],Matica);
  1062.  
  1063.     for (int i=0;i<8;i++)
  1064.     {
  1065.         //
  1066.         //min max
  1067.         //
  1068.     
  1069.         if (P[i].X < Min.X)
  1070.             Min.X = P[i].X;
  1071.         if (P[i].Y < Min.Y)
  1072.             Min.Y = P[i].Y;
  1073.         if (P[i].Z < Min.Z)
  1074.             Min.Z = P[i].Z;
  1075.     
  1076.         if (P[i].X > Max.X)
  1077.             Max.X = P[i].X;
  1078.         if (P[i].Y > Max.Y)
  1079.             Max.Y = P[i].Y;
  1080.         if (P[i].Z > Max.Z)
  1081.             Max.Z = P[i].Z;
  1082.  
  1083.             
  1084.     }
  1085.  
  1086.     //
  1087.     //uloz hodnoty
  1088.     //
  1089.  
  1090.     Mod->Centre.X = (Max.X + Min.X)/2.0f;
  1091.     Mod->Centre.Y = (Max.Y + Min.Y)/2.0f;
  1092.     Mod->Centre.Z = (Max.Z + Min.Z)/2.0f;
  1093.  
  1094.     Mod->Min = Min;
  1095.     Mod->Max = Max;
  1096.  
  1097.     Mod->Polomer = CalcDistance(Min,Mod->Centre);
  1098.     
  1099.     
  1100. }
  1101.  
  1102.  
  1103. //------------------------------------------------------------------
  1104. // Name: TransformModel()
  1105. // Desc: 
  1106. //------------------------------------------------------------------
  1107. void MODEL::TransformModel(MODELFRAME *Mod,D3DXMATRIXA16 Matica)
  1108. {
  1109.  
  1110.  
  1111.     for (int i=0;i<NumFaces;i++)
  1112.     {
  1113.         Mod->FaceList[i].P[0] = TransformPoint(Mod->FaceList[i].P[0],Matica);    
  1114.         Mod->FaceList[i].P[1] = TransformPoint(Mod->FaceList[i].P[1],Matica);    
  1115.         Mod->FaceList[i].P[2] = TransformPoint(Mod->FaceList[i].P[2],Matica);    
  1116.  
  1117.         Mod->FaceList[i].N[0] = TransformNormal(Mod->FaceList[i].N[0],Matica);    
  1118.         Mod->FaceList[i].N[1] = TransformNormal(Mod->FaceList[i].N[1],Matica);    
  1119.         Mod->FaceList[i].N[2] = TransformNormal(Mod->FaceList[i].N[2],Matica);
  1120.         
  1121.         Mod->FaceList[i].Plane = TransformPlane(Mod->FaceList[i].Plane,Matica);
  1122.     
  1123.         Mod->ZeroPoint = TransformPoint(Mod->ZeroPoint,Matica);
  1124.     }
  1125. }
  1126.  
  1127.  
  1128.  
  1129. //------------------------------------------------------------------
  1130. // Name: InterpolateModel()
  1131. // Desc: interpoluje model a posle ho do ModelT
  1132. //------------------------------------------------------------------
  1133. void MODEL::InterpolateModel(MODELFRAME *Mod)
  1134. {
  1135. /*    
  1136.     //dolny horny snimok
  1137.     int F1 = (int)Frame;
  1138.     int F2 = ((int)Frame) + 1;
  1139.  
  1140.     if (F2 == NumFrames)
  1141.         F2 = 0;
  1142.  
  1143.     //Interpolant
  1144.     float Int = Frame - ((float)F1);
  1145.  
  1146.     //netreba zbytocne interpolovat ak je interpolant rovny nule
  1147.     if (Int != 0.0f)
  1148.     {
  1149.     
  1150.         for (int i=0;i<NumFaces;i++)
  1151.         {
  1152.  
  1153.             for (int u=0;u<3;u++)
  1154.             {
  1155.                 Mod->FaceList[i].P[u].X = ModelFrame[F1].FaceList[i].P[u].X + (Int *(ModelFrame[F2].FaceList[i].P[u].X - ModelFrame[F1].FaceList[i].P[u].X));    
  1156.                 Mod->FaceList[i].P[u].Y = ModelFrame[F1].FaceList[i].P[u].Y + (Int *(ModelFrame[F2].FaceList[i].P[u].Y - ModelFrame[F1].FaceList[i].P[u].Y));    
  1157.                 Mod->FaceList[i].P[u].Z = ModelFrame[F1].FaceList[i].P[u].Z + (Int *(ModelFrame[F2].FaceList[i].P[u].Z - ModelFrame[F1].FaceList[i].P[u].Z));    
  1158.  
  1159.                 Mod->FaceList[i].N[u].X = ModelFrame[F1].FaceList[i].N[u].X + (Int *(ModelFrame[F2].FaceList[i].N[u].X - ModelFrame[F1].FaceList[i].N[u].X));    
  1160.                 Mod->FaceList[i].N[u].Y = ModelFrame[F1].FaceList[i].N[u].Y + (Int *(ModelFrame[F2].FaceList[i].N[u].Y - ModelFrame[F1].FaceList[i].N[u].Y));    
  1161.                 Mod->FaceList[i].N[u].Z = ModelFrame[F1].FaceList[i].N[u].Z + (Int *(ModelFrame[F2].FaceList[i].N[u].Z - ModelFrame[F1].FaceList[i].N[u].Z));    
  1162.     
  1163.                 Mod->FaceList[i].T[u].X = ModelFrame[F1].FaceList[i].T[u].X;    
  1164.                 Mod->FaceList[i].T[u].Y = ModelFrame[F1].FaceList[i].T[u].Y;    
  1165.     
  1166.             }
  1167.  
  1168.             Mod->FaceList[i].Plane.Normal.X = ModelFrame[F1].FaceList[i].Plane.Normal.X + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.X - ModelFrame[F1].FaceList[i].Plane.Normal.X));    
  1169.             Mod->FaceList[i].Plane.Normal.Y = ModelFrame[F1].FaceList[i].Plane.Normal.Y + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.Y - ModelFrame[F1].FaceList[i].Plane.Normal.Y));    
  1170.             Mod->FaceList[i].Plane.Normal.Z = ModelFrame[F1].FaceList[i].Plane.Normal.Z + (Int *(ModelFrame[F2].FaceList[i].Plane.Normal.Z - ModelFrame[F1].FaceList[i].Plane.Normal.Z));    
  1171.             Mod->FaceList[i].Plane.D = ModelFrame[F1].FaceList[i].Plane.D + (Int *(ModelFrame[F2].FaceList[i].Plane.D - ModelFrame[F1].FaceList[i].Plane.D));    
  1172.     
  1173.  
  1174.             for (u=0;u<8;u++)
  1175.             {
  1176.                 Mod->P[u] = ModelFrame[F1].P[u];
  1177.             }
  1178.         }
  1179.     
  1180.     }
  1181.  
  1182.     else  ////////
  1183.  
  1184.     {
  1185.         for (int i=0;i<NumFaces;i++)
  1186.         {
  1187.             for (int u=0;u<3;u++)
  1188.             {
  1189.                 Mod->FaceList[i].P[u] = ModelFrame[F1].FaceList[i].P[u] ;    
  1190.                 Mod->FaceList[i].N[u] = ModelFrame[F1].FaceList[i].N[u] ;    
  1191.                 Mod->FaceList[i].Plane = ModelFrame[F1].FaceList[i].Plane;    
  1192.                 Mod->FaceList[i].T[u] = ModelFrame[F1].FaceList[i].T[u];    
  1193.                 Mod->FaceList[i].T[u] = ModelFrame[F1].FaceList[i].T[u];    
  1194.     
  1195.             }
  1196.  
  1197.             for (u=0;u<8;u++)
  1198.             {
  1199.                 Mod->P[u] = ModelFrame[F1].P[u];
  1200.             }
  1201.         }
  1202.     
  1203.     }*/
  1204. }
  1205.  
  1206. //------------------------------------------------------------------
  1207. // Name: Smooth Shading
  1208. // Desc: vypocita smooth shading
  1209. //------------------------------------------------------------------
  1210. void MODEL::CalcSmoothShading(MODELFRAME *Mod)
  1211. {
  1212.  
  1213.     VECTOR3D *Normal = NULL;
  1214.     Normal = new VECTOR3D[NumFaces];
  1215.     
  1216.     for (int i=0;i<NumFaces;i=i+1)
  1217.     {
  1218.     for (int u=0;u<3;u=u+1)
  1219.     {
  1220.  
  1221.         //bod
  1222.         VECTOR3D B = Mod->FaceList[i].P[u];
  1223.         
  1224.         VECTOR3D NormalVys = Get3D(0.0f,0.0f,0.0f);
  1225.         int ActNormal = 0;
  1226.  
  1227.         //ziskaj normaly
  1228.         for (int j=0;j<NumFaces;j=j+1)
  1229.         {
  1230.         for (int k=0;k<3;k=k+1)
  1231.         {
  1232.             
  1233.  
  1234.             if((B.X == Mod->FaceList[j].P[k].X)  &&
  1235.                (B.Y == Mod->FaceList[j].P[k].Y)  &&
  1236.                (B.Z == Mod->FaceList[j].P[k].Z) )
  1237.             {
  1238.         
  1239.                 Normal[ActNormal] = Mod->FaceList[j].Plane.Normal ;
  1240.                 ActNormal++;
  1241.                             
  1242.             }
  1243.  
  1244.         }
  1245.         }
  1246.  
  1247.         //vypocitaj normalu
  1248.         for (int a=0;a<ActNormal;a++)
  1249.         {
  1250.             Add(&NormalVys,NormalVys,Normal[a]);
  1251.         }
  1252.         
  1253.         //normalizuj vyslednu normalu
  1254.         Normalize(&NormalVys);
  1255.  
  1256.         //zapis nove normaly
  1257.         for (j=0;j<NumFaces;j++)
  1258.         {
  1259.         for (int k=0;k<3;k++)
  1260.         {
  1261.  
  1262.             if((B.X == Mod->FaceList[j].P[k].X)  &&
  1263.                (B.Y == Mod->FaceList[j].P[k].Y)  &&
  1264.                (B.Z == Mod->FaceList[j].P[k].Z) )
  1265.             {
  1266.                 Mod->FaceList[j].N[k] = NormalVys;
  1267.             }
  1268.  
  1269.         }
  1270.         }
  1271.  
  1272.  
  1273.     }
  1274.     }
  1275.  
  1276.     if (Normal != NULL)
  1277.         delete [] Normal;
  1278.     Normal = NULL;
  1279.  
  1280.  
  1281.  
  1282. }
  1283.  
  1284.  
  1285. //------------------------------------------------------------------
  1286. // Name: SetMaterial()
  1287. // Desc: nastavy material
  1288. //------------------------------------------------------------------
  1289. void MODEL::SetMaterial(D3DMATERIAL9 Mat)
  1290. {
  1291.     Material = Mat;
  1292. }
  1293.  
  1294.  
  1295. //------------------------------------------------------------------
  1296. // Name: CollisionBox()
  1297. // Desc: Bouring box kolizia
  1298. //------------------------------------------------------------------
  1299. bool MODEL::CollisionBox(VECTOR3D P1, VECTOR3D P2,D3DXMATRIX PomMatrix)
  1300. {
  1301.  
  1302.     //transformuj body
  1303.     P1 = UnTransformPoint(P1,PomMatrix);
  1304.     P2 = UnTransformPoint(P2,PomMatrix);
  1305.  
  1306.     if (CollisionBoxEdge(P1,P2,ModelFrame.P[0],ModelFrame.P[6]))
  1307.         return true;
  1308.     else
  1309.         return false;
  1310.  
  1311. }
  1312.  
  1313.  
  1314. //------------------------------------------------------------------
  1315. // Name: CollisionDetail()
  1316. // Desc: detailna kolizia
  1317. //------------------------------------------------------------------
  1318. bool MODEL::CollisionDetail(VECTOR3D P1,VECTOR3D P2,D3DXMATRIX PomMatrix)
  1319. {
  1320.  
  1321.     //iba ak collision BOX == true
  1322.     if (CollisionBox(P1,P2,PomMatrix) == false)
  1323.         return false;
  1324.     else
  1325.     {
  1326.  
  1327.  
  1328.     //uhly
  1329.     float U,U1,U2,U3;
  1330.  
  1331.     //
  1332.     //testuj pre vsetky face
  1333.     //
  1334.  
  1335.  
  1336.     //transformuj body
  1337.     P1 = UnTransformPoint(P1,PomMatrix);
  1338.     P2 = UnTransformPoint(P2,PomMatrix);
  1339.  
  1340.     VECTOR3D Inter; //priesecnik
  1341.  
  1342.     for (int i=0;i<NumFaces;i++)
  1343.     {
  1344.  
  1345.         if (CalcPriesEdge(&Inter,ModelFrame.FaceList[i].Plane,P1,P2) == true)
  1346.         {
  1347.             
  1348.             U1 = CalcAngleCentre(Inter,ModelFrame.FaceList[i].P[0],
  1349.                                        ModelFrame.FaceList[i].P[1]);
  1350.             U2 = CalcAngleCentre(Inter,ModelFrame.FaceList[i].P[1],
  1351.                                        ModelFrame.FaceList[i].P[2]);
  1352.             U3 = CalcAngleCentre(Inter,ModelFrame.FaceList[i].P[2],
  1353.                                        ModelFrame.FaceList[i].P[0]);
  1354.  
  1355.             U = U1+U2+U3;
  1356.  
  1357.             if (U > 6.2f && U < 6.35f)
  1358.             {
  1359.                 ColPosition = TransformPoint(Inter,PomMatrix);
  1360.                 ColNormal = TransformNormal(ModelFrame.FaceList[i].Plane.Normal,PomMatrix);
  1361.             
  1362.                 return true;
  1363.             }
  1364.         }
  1365.     }
  1366.  
  1367.     return false;
  1368.  
  1369.     }
  1370.  
  1371. }
  1372.  
  1373. //------------------------------------------------------------------
  1374. // Name: LoadMD2
  1375. // Desc: Nacita MD2 model
  1376. //------------------------------------------------------------------
  1377. void MODEL::LoadMD2(char *FileName,int NFrames)
  1378. {
  1379.  
  1380. /*    //info pre Log
  1381.     char cBuf[80];
  1382.     LogPrint("Inicializujem MD2 model");
  1383.     sprintf(cBuf,"  Subor: %s",FileName);
  1384.     
  1385.  
  1386.     FILE *File = NULL;  //subor z ktoreho sa bude citat
  1387.  
  1388.     tMd2Header m_Header;
  1389.  
  1390.     ////////////////
  1391.     //otvori subor//
  1392.     ////////////////
  1393.     File = fopen(FileName, "rb");
  1394.     if (File == NULL)
  1395.         LogPrint("  Subor sa nenasiel");
  1396.  
  1397.  
  1398.     ////////////////////
  1399.     //nacitaj hlavicku//
  1400.     ////////////////////
  1401.     fread(&m_Header, 1, sizeof(tMd2Header), File);
  1402.     
  1403.     NumFaces = m_Header.numTriangles;
  1404.     NumFrames = NFrames;
  1405.  
  1406.     //info pre log
  1407.     sprintf(cBuf,"  Pocet snimkov: %d",m_Header.numFrames);
  1408.     LogPrint(cBuf);
  1409.     sprintf(cBuf,"  Pocet vertex: %d",m_Header.numVertices);
  1410.     LogPrint(cBuf);
  1411.     sprintf(cBuf,"  Pocet trojholnikov: %d",m_Header.numTriangles);
  1412.     LogPrint(cBuf);
  1413.  
  1414.  
  1415.     /////////////////////////
  1416.     //inicializacia modelov//
  1417.     /////////////////////////
  1418.  
  1419.     //vytvori zasobnik modelov
  1420.     ModelFrame = new MODELFRAME [NumFrames];
  1421.  
  1422.     //inicializuje zasobnik modelov
  1423.     for (int i=0;i<NumFrames;i++)
  1424.     {
  1425.         InitializeModel(&ModelFrame[i],NumFaces);
  1426.     }
  1427.  
  1428.     //inicializuje transformovany model
  1429.     InitializeModel(&ModelT,NumFaces);
  1430.  
  1431.     ////////////////////////////
  1432.     //vytvaranie vertex buffer//
  1433.     ////////////////////////////
  1434.  
  1435.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  1436.                                    D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXMODEL,
  1437.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  1438.       {
  1439.         LogPrint("  Chyba pri vytvarani VB");
  1440.     }
  1441.     else
  1442.     {
  1443.         LogPrint("  Vertex Buffer vytvoreny");
  1444.     }
  1445.  
  1446.     ///////////////////////////////////
  1447.     //veci potrebne pre nacitanie MD2//
  1448.     ///////////////////////////////////
  1449.     unsigned char buffer[MD2_MAX_FRAMESIZE];
  1450.  
  1451.     tMd2Skin *m_pSkins         = new tMd2Skin [m_Header.numSkins];
  1452.     tMd2TexCoord *m_pTexCoords = new tMd2TexCoord [m_Header.numTexCoords];
  1453.     tMd2Face *m_pTriangles     = new tMd2Face [m_Header.numTriangles];
  1454.     tMd2Frame *m_pFrames       = new tMd2Frame [m_Header.numFrames];
  1455.  
  1456.  
  1457.     //////////////////////
  1458.     //Nacitavanie udajov//
  1459.     //////////////////////
  1460.     
  1461.     fseek(File, m_Header.offsetSkins, SEEK_SET);
  1462.     fread(m_pSkins, sizeof(tMd2Skin), m_Header.numSkins, File);
  1463.     
  1464.     fseek(File, m_Header.offsetTexCoords, SEEK_SET);
  1465.     fread(m_pTexCoords, sizeof(tMd2TexCoord), m_Header.numTexCoords, File);
  1466.  
  1467.     fseek(File, m_Header.offsetTriangles, SEEK_SET);
  1468.     fread(m_pTriangles, sizeof(tMd2Face), m_Header.numTriangles, File);
  1469.             
  1470.     fseek(File, m_Header.offsetFrames, SEEK_SET);
  1471.  
  1472.     for (i=0; i < m_Header.numFrames; i++)
  1473.     {
  1474.         // Assign our alias frame to our buffer memory
  1475.         tMd2AliasFrame *pFrame = (tMd2AliasFrame *) buffer;
  1476.  
  1477.         // Allocate the memory for the first frame of animation's vertices
  1478.         m_pFrames[i].pVertices = new tMd2Triangle [m_Header.numVertices];
  1479.  
  1480.         // Read in the first frame of animation
  1481.         fread(pFrame, 1, m_Header.frameSize, File);
  1482.  
  1483.         // Store off a vertex array pointer to cut down large lines of code
  1484.         tMd2Triangle *pVertices = m_pFrames[i].pVertices;
  1485.         
  1486.         // Go through all of the number of vertices and assign the scale and translations.
  1487.         // Store the vertices in our current frame's vertex list array, while swapping Y and Z.
  1488.         // Notice we also negate the Z axis as well to make the swap correctly.
  1489.         for (int j=0; j < m_Header.numVertices; j++)
  1490.         {
  1491.             pVertices[j].vertex[0] = pFrame->aliasVertices[j].vertex[0] * pFrame->scale[0] + pFrame->translate[0];
  1492.             pVertices[j].vertex[2] = -1 * (pFrame->aliasVertices[j].vertex[1] * pFrame->scale[1] + pFrame->translate[1]);
  1493.             pVertices[j].vertex[1] = pFrame->aliasVertices[j].vertex[2] * pFrame->scale[2] + pFrame->translate[2];
  1494.         }
  1495.     }
  1496.  
  1497.  
  1498.     fclose(File);
  1499.  
  1500.     /////////////////
  1501.     //Konvertovanie// 
  1502.     /////////////////
  1503.     //opakuj pre kazdy frame
  1504.     for (i=0;i<NFrames;i++)
  1505.     {
  1506.  
  1507.         //pre vsetky trojholniky vo frame
  1508.         for (int u=0;u<m_Header.numTriangles;u++)
  1509.         {
  1510.             int V1,V2,V3; //index vertexov
  1511.             int T1,T2,T3; //index texturovych kordinatov
  1512.  
  1513.  
  1514.             V1 = m_pTriangles[u].vertexIndices[0];
  1515.             V2 = m_pTriangles[u].vertexIndices[1];
  1516.             V3 = m_pTriangles[u].vertexIndices[2];
  1517.  
  1518.             T1 = m_pTriangles[u].textureIndices[0];
  1519.             T2 = m_pTriangles[u].textureIndices[1];
  1520.             T3 = m_pTriangles[u].textureIndices[2];
  1521.  
  1522.             ModelFrame[i].FaceList[u].P[2].X =     m_pFrames[i].pVertices[V1].vertex[0];        
  1523.             ModelFrame[i].FaceList[u].P[2].Y =     m_pFrames[i].pVertices[V1].vertex[1];    
  1524.             ModelFrame[i].FaceList[u].P[2].Z =     m_pFrames[i].pVertices[V1].vertex[2];
  1525.             ModelFrame[i].FaceList[u].T[2].X =     m_pTexCoords[T1].u/float(m_Header.skinWidth) ;        
  1526.             ModelFrame[i].FaceList[u].T[2].Y =     m_pTexCoords[T1].v/float(m_Header.skinHeight);
  1527.  
  1528.             ModelFrame[i].FaceList[u].P[1].X =     m_pFrames[i].pVertices[V2].vertex[0];        
  1529.             ModelFrame[i].FaceList[u].P[1].Y =     m_pFrames[i].pVertices[V2].vertex[1];    
  1530.             ModelFrame[i].FaceList[u].P[1].Z =     m_pFrames[i].pVertices[V2].vertex[2];
  1531.             ModelFrame[i].FaceList[u].T[1].X =     m_pTexCoords[T2].u/float(m_Header.skinWidth);        
  1532.             ModelFrame[i].FaceList[u].T[1].Y =     m_pTexCoords[T2].v/float(m_Header.skinHeight);
  1533.  
  1534.             ModelFrame[i].FaceList[u].P[0].X =     m_pFrames[i].pVertices[V3].vertex[0];        
  1535.             ModelFrame[i].FaceList[u].P[0].Y =     m_pFrames[i].pVertices[V3].vertex[1];    
  1536.             ModelFrame[i].FaceList[u].P[0].Z =     m_pFrames[i].pVertices[V3].vertex[2];
  1537.             ModelFrame[i].FaceList[u].T[0].X =     m_pTexCoords[T3].u/float(m_Header.skinWidth);        
  1538.             ModelFrame[i].FaceList[u].T[0].Y =     m_pTexCoords[T3].v/float(m_Header.skinHeight);
  1539.  
  1540.         }
  1541.  
  1542.         //vypocitajminmax
  1543.         CalcBoxPoints(&ModelFrame[i]);
  1544.  
  1545.         //vypocitaj normaly
  1546.         if (Normals == true)
  1547.             CalcFaceNormals(&ModelFrame[i]);
  1548.  
  1549.         //vypocitaj smooth shading
  1550.         if (SmoothShading == true)
  1551.             CalcSmoothShading(&ModelFrame[i]);
  1552.  
  1553.     }*/
  1554.  
  1555.                             
  1556.  
  1557. }
  1558.  
  1559. //------------------------------------------------------------------
  1560. // Name: SaveSHD
  1561. // Desc: Ulozi model ako SHD
  1562. //------------------------------------------------------------------
  1563. void MODEL::SaveSHD(char *FileName)
  1564. {
  1565.  
  1566. /*    //struktury pre zapis
  1567.     Shd_Header Header;
  1568.     Shd_Face Face;
  1569.  
  1570.     //subor
  1571.     FILE *File;
  1572.     File = fopen(FileName,"wb");
  1573.  
  1574.     //nastavy header
  1575.     Header.NumFaces = NumFaces;
  1576.     Header.NumFrames = NumFrames;
  1577.     Header.Version = 1;
  1578.  
  1579.     //zapis header
  1580.     fwrite(&Header,sizeof(Header),1,File);
  1581.  
  1582.     //zapise pole
  1583.     for (int i=0;i<NumFrames;i++)
  1584.     {
  1585.         for (int u=0;u<NumFaces;u++)
  1586.         {
  1587.  
  1588.             Face.Vertex[0].P[0] = ModelFrame[i].FaceList[u].P[0].X;
  1589.             Face.Vertex[0].P[1] = ModelFrame[i].FaceList[u].P[0].Y;
  1590.             Face.Vertex[0].P[2] = ModelFrame[i].FaceList[u].P[0].Z;
  1591.             Face.Vertex[0].N[0] = ModelFrame[i].FaceList[u].N[0].X;
  1592.             Face.Vertex[0].N[1] = ModelFrame[i].FaceList[u].N[0].Y;
  1593.             Face.Vertex[0].N[2] = ModelFrame[i].FaceList[u].N[0].Z;
  1594.             Face.Vertex[0].T[0] = ModelFrame[i].FaceList[u].T[0].X;
  1595.             Face.Vertex[0].T[1] = ModelFrame[i].FaceList[u].T[0].Y;
  1596.  
  1597.             Face.Vertex[1].P[0] = ModelFrame[i].FaceList[u].P[1].X;
  1598.             Face.Vertex[1].P[1] = ModelFrame[i].FaceList[u].P[1].Y;
  1599.             Face.Vertex[1].P[2] = ModelFrame[i].FaceList[u].P[1].Z;
  1600.             Face.Vertex[1].N[0] = ModelFrame[i].FaceList[u].N[1].X;
  1601.             Face.Vertex[1].N[1] = ModelFrame[i].FaceList[u].N[1].Y;
  1602.             Face.Vertex[1].N[2] = ModelFrame[i].FaceList[u].N[1].Z;
  1603.             Face.Vertex[1].T[0] = ModelFrame[i].FaceList[u].T[1].X;
  1604.             Face.Vertex[1].T[1] = ModelFrame[i].FaceList[u].T[1].Y;
  1605.  
  1606.             Face.Vertex[2].P[0] = ModelFrame[i].FaceList[u].P[2].X;
  1607.             Face.Vertex[2].P[1] = ModelFrame[i].FaceList[u].P[2].Y;
  1608.             Face.Vertex[2].P[2] = ModelFrame[i].FaceList[u].P[2].Z;
  1609.             Face.Vertex[2].N[0] = ModelFrame[i].FaceList[u].N[2].X;
  1610.             Face.Vertex[2].N[1] = ModelFrame[i].FaceList[u].N[2].Y;
  1611.             Face.Vertex[2].N[2] = ModelFrame[i].FaceList[u].N[2].Z;
  1612.             Face.Vertex[2].T[0] = ModelFrame[i].FaceList[u].T[2].X;
  1613.             Face.Vertex[2].T[1] = ModelFrame[i].FaceList[u].T[2].Y;
  1614.     
  1615.             Face.Normal[0] = ModelFrame[i].FaceList[u].Plane.Normal.X;
  1616.             Face.Normal[1] = ModelFrame[i].FaceList[u].Plane.Normal.Y;
  1617.             Face.Normal[2] = ModelFrame[i].FaceList[u].Plane.Normal.Z;
  1618.             Face.D         = ModelFrame[i].FaceList[u].Plane.D;
  1619.  
  1620.             fwrite(&Face,sizeof(Face),1,File);
  1621.  
  1622.         }
  1623.     }
  1624.  
  1625.  
  1626.     //zavri subor
  1627.     fclose(File);*/
  1628.  
  1629. }
  1630.  
  1631. //------------------------------------------------------------------
  1632. // Name: LoadSHD
  1633. // Desc: Loadne SHD model
  1634. //------------------------------------------------------------------
  1635. void MODEL::LoadSHD(char *FileName)
  1636. {
  1637. /*
  1638.     //log
  1639.     char cBuf[80];
  1640.     LogPrint("Inicializujem SHD subor");
  1641.     sprintf(cBuf,"  Subor: %s",FileName);
  1642.     LogPrint(cBuf);
  1643.  
  1644.     //struktury pre citanie
  1645.     Shd_Header Header;
  1646.     Shd_Face Face;
  1647.  
  1648.     /////////
  1649.     //subor//
  1650.     /////////
  1651.     FILE *File = NULL;
  1652.     File = fopen(FileName,"rb");
  1653.     if (File == NULL)
  1654.         LogPrint("  Subor sa nenasiel");
  1655.  
  1656.     ////////////////////
  1657.     //precita hlavicku//
  1658.     ////////////////////
  1659.     fread(&Header,sizeof(Header),1,File);
  1660.  
  1661.     ////////////////////
  1662.     //nastavy premenne//
  1663.     ////////////////////
  1664.     NumFaces = Header.NumFaces;
  1665.     NumFrames = Header.NumFrames;
  1666.  
  1667.     sprintf(cBuf,"  Pocet trojholnikov: %d",NumFaces);
  1668.     LogPrint(cBuf);
  1669.  
  1670.     sprintf(cBuf,"  Pocet snimkov: %d",NumFrames);
  1671.     LogPrint(cBuf);
  1672.  
  1673.     /////////////////////////
  1674.     //inicializacia modelov//
  1675.     /////////////////////////
  1676.  
  1677.     //vytvori zasobnik modelov
  1678.     ModelFrame = new MODELFRAME [NumFrames];
  1679.  
  1680.     //inicializuje zasobnik modelov
  1681.     for (int i=0;i<NumFrames;i++)
  1682.     {
  1683.         InitializeModel(&ModelFrame[i],NumFaces);
  1684.     }
  1685.  
  1686.     //inicializuje transformovany model
  1687.     InitializeModel(&ModelT,NumFaces);
  1688.  
  1689.     ////////////////////////////
  1690.     //vytvaranie vertex buffer//
  1691.     ////////////////////////////
  1692.  
  1693.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(NumFaces*3*sizeof(CUSTOMVERTEXMODEL),
  1694.                                    D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEXMODEL,
  1695.                                    D3DPOOL_DEFAULT, &g_pVB, NULL )))
  1696.       {
  1697.         LogPrint("  Chyba pri vytvarani VB");
  1698.     }
  1699.     else
  1700.     {
  1701.         LogPrint("  Vertex Buffer vytvoreny");
  1702.     }
  1703.  
  1704.     /////////////////
  1705.     //Konvertovanie// 
  1706.     /////////////////
  1707.     for (i=0;i<NumFrames;i++)
  1708.     {
  1709.         for (int u=0;u<NumFaces;u++)
  1710.         {
  1711.             fread(&Face,sizeof(Face),1,File);
  1712.  
  1713.             ModelFrame[i].FaceList[u].P[0].X = Face.Vertex[0].P[0];
  1714.             ModelFrame[i].FaceList[u].P[0].Y = Face.Vertex[0].P[1];
  1715.             ModelFrame[i].FaceList[u].P[0].Z = Face.Vertex[0].P[2];
  1716.             ModelFrame[i].FaceList[u].N[0].X = Face.Vertex[0].N[0];
  1717.             ModelFrame[i].FaceList[u].N[0].Y = Face.Vertex[0].N[1];
  1718.             ModelFrame[i].FaceList[u].N[0].Z = Face.Vertex[0].N[2];
  1719.             ModelFrame[i].FaceList[u].T[0].X = Face.Vertex[0].T[0] ;
  1720.             ModelFrame[i].FaceList[u].T[0].Y = Face.Vertex[0].T[1];
  1721.  
  1722.             ModelFrame[i].FaceList[u].P[1].X = Face.Vertex[1].P[0];
  1723.             ModelFrame[i].FaceList[u].P[1].Y = Face.Vertex[1].P[1];
  1724.             ModelFrame[i].FaceList[u].P[1].Z = Face.Vertex[1].P[2];
  1725.             ModelFrame[i].FaceList[u].N[1].X = Face.Vertex[1].N[0];
  1726.             ModelFrame[i].FaceList[u].N[1].Y = Face.Vertex[1].N[1];
  1727.             ModelFrame[i].FaceList[u].N[1].Z = Face.Vertex[1].N[2] ;
  1728.             ModelFrame[i].FaceList[u].T[1].X = Face.Vertex[1].T[0];
  1729.             ModelFrame[i].FaceList[u].T[1].Y = Face.Vertex[1].T[1];
  1730.  
  1731.             ModelFrame[i].FaceList[u].P[2].X = Face.Vertex[2].P[0];
  1732.             ModelFrame[i].FaceList[u].P[2].Y = Face.Vertex[2].P[1];
  1733.             ModelFrame[i].FaceList[u].P[2].Z = Face.Vertex[2].P[2];
  1734.             ModelFrame[i].FaceList[u].N[2].X = Face.Vertex[2].N[0];
  1735.             ModelFrame[i].FaceList[u].N[2].Y = Face.Vertex[2].N[1];
  1736.             ModelFrame[i].FaceList[u].N[2].Z = Face.Vertex[2].N[2];
  1737.             ModelFrame[i].FaceList[u].T[2].X = Face.Vertex[2].T[0];
  1738.             ModelFrame[i].FaceList[u].T[2].Y = Face.Vertex[2].T[1];
  1739.     
  1740.             ModelFrame[i].FaceList[u].Plane.Normal.X = Face.Normal[0];
  1741.             ModelFrame[i].FaceList[u].Plane.Normal.Y = Face.Normal[1];
  1742.             ModelFrame[i].FaceList[u].Plane.Normal.Z = Face.Normal[2];
  1743.             ModelFrame[i].FaceList[u].Plane.D = Face.D;
  1744.         
  1745.  
  1746.         }
  1747.  
  1748.         //vypocitaj min max pre kazdy snimok
  1749.         CalcBoxPoints(&ModelFrame[i]);
  1750.     }
  1751.     
  1752.  
  1753.     //zavri subor
  1754.     fclose(File);*/
  1755.  
  1756. }
  1757.  
  1758. //------------------------------------------------------------------
  1759. // Name: BuildShadow()
  1760. // Desc: urobi tien do stencil class
  1761. //------------------------------------------------------------------
  1762. void MODEL::BuildShadow(STENCIL *Stn)
  1763. {
  1764.  
  1765.     //nastavi maticu
  1766.     g_pd3dDevice->SetTransform( D3DTS_WORLD, &Matica);
  1767.  
  1768.     //transformuje svetlo do priestoru modelu
  1769.     VECTOR3D LightPos = UnTransformPoint(Stn->LightPosition,Matica);
  1770.         
  1771.     for (int i=0;i<ModelFrame.NumFaces;i++)
  1772.     {
  1773.         
  1774.         //ak je face otoceny k svetlu vynechaj
  1775.         if (( ModelFrame.FaceList[i].Plane.Normal.X*LightPos.X + 
  1776.               ModelFrame.FaceList[i].Plane.Normal.Y*LightPos.Y + 
  1777.               ModelFrame.FaceList[i].Plane.Normal.Z*LightPos.Z + 
  1778.               ModelFrame.FaceList[i].Plane.D) <= 0.0f)
  1779.               continue;
  1780.  
  1781.         Stn->AddEdge(ModelFrame.FaceList[i].P[0],ModelFrame.FaceList[i].P[1]);
  1782.         Stn->AddEdge(ModelFrame.FaceList[i].P[1],ModelFrame.FaceList[i].P[2]);
  1783.         Stn->AddEdge(ModelFrame.FaceList[i].P[2],ModelFrame.FaceList[i].P[0]);
  1784.           
  1785.     }
  1786.  
  1787.     //vyberie quady ktore su nakraji
  1788.     Stn->ProcessEdge(LightPos);
  1789.  
  1790.     //vyrenderuje hotovy tien
  1791.     Stn->RenderShadow();
  1792.  
  1793. }